package com.yanggu.jt808.model.base;

import lombok.Data;

/**
 * 消息头16个字节(2019年版协议为20个字节)
 */
@Data
public class Header {

    /**
     * 消息ID 2字节(由于是无符号使用大的数据类型存放)
     */
    private int msgId;

    /**
     * 消息体属性 2字节(由于是无符号使用大的数据类型存放)
     */
    private int msgBodyProps;

    /**
     * 协议版本号 1字节(2019年协议, 新增字段)(由于是无符号使用大的数据类型存放)
     */
    private short protocolVersion;

    /**
     * 是否是2019年协议
     */
    private boolean ifVersion2019;

    /**
     * 终端手机号 6字节(2019年版协议为10字节) BCD码
     */
    private String terminalPhone;

    /**
     * 流水号 2字节(由于是无符号使用大的数据类型存放)
     */
    private int flowId;

    /**
     * 消息总包数 2字节(由于是无符号使用大的数据类型存放)
     */
    private int totalPackage;

    /**
     * 包序号 2字节(由于是无符号使用大的数据类型存放)
     */
    private int packageNumber;

    /**
     * 是否分包
     */
    private boolean isSubPackage;

    /**
     * 加密类型 3字节
     */
    private byte encryptionType;



    private static final int BODY_LENGTH = 0b0000_0011_1111_1111;
    private static final int ENCRYPTION = 0b00011_100_0000_0000;
    private static final int SUBPACKAGE = 0b0010_0000_0000_0000;
    private static final int VERSION = 0b0100_0000_0000_0000;
    private static final int RESERVED = 0b1000_0000_0000_0000;


    //获取包体长度
    public short getMsgBodyLength() {
        return (short) (msgBodyProps & 0x3ff);
    }

    public boolean isIfVersion2019(byte[] msgBodyProp) {
        return (msgBodyProp[0] & 0x40) == 0x40;
    }

    /** 加密方式 */
    public int getEncryption() {
        return (msgBodyProps & ENCRYPTION) >> 10;
    }


    /** 是否分包 */
    public boolean ifSubpackage() {
        return (msgBodyProps & SUBPACKAGE) == SUBPACKAGE;
    }

    /** 是否有版本 */
    public boolean isVersion() {
        return (msgBodyProps & VERSION) == VERSION;
    }

}